// promise是es6新增的一种解决异步的方式，主要解决了回调函数的回调地狱问题
// promise有三种状态 pending（进行中）、fulfilled（已成功）和rejected（已失败), 状态是不可逆的
// promise有很多方法, 3中原型方法（then, catch, finally），和很多静态方法(all, race, resolve, reject, allSettled, any)

// 创建promise
const done = true;
const p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    if (done) {
      resolve("ok");
    } else {
      reject("no ok");
    }
  }, 2000);
});
const p2 = new Promise((resolve, reject) => {
  if (!done) {
    resolve("好");
  } else {
    reject("不好");
  }
});

// 消费promise
// 当状态从pending -> fulfilled时候执行then函数
// 当状态从pending -> rejected时候执行catch函数
// finally是不管成功失败都会执行
// p1.then((res) => {
//   console.log(res);
//   return 123;
// })
//   .then((res) => {
//     console.log(res);
//   })
//   .catch((err) => {
//     console.log(err);
//   })
//   .finally(() => {
//     console.log("finally");
//   });

// all参数是数组，由promise对象组成的数组
// all方法的返回值是promise对象
// 当数组的promise对象的结果全部成功以后，走then函数，并且返回所有成功的结果组成的数组
// 如果其中由一个失败，走catch函数，返回的是最先失败的那个结果
// Promise.all([p1, p2])
//   .then((res) => {
//     console.log(res);
//   })
//   .catch((err) => {
//     console.log(err);
//   });

// race参数是数组，由promise对象组成的数组
// race方法的返回值是promise对象
// 返回的是第一个出结果的那个promise对象的结果
Promise.race([p1, p2])
  .then((res) => {
    console.log(res);
  })
  .catch((err) => {
    console.log(err);
  });
